home *** CD-ROM | disk | FTP | other *** search
- #include <osbind.h>
- #include <unistd.h>
- #include <signal.h>
- #include <errno.h>
- #include <sys/time.h>
- #include "itimer.h"
-
- #ifndef Tsetitimer
- #define trap_1_wwllll(n, a, b, c, d, e) \
- __extension__ \
- ({ \
- register long retvalue __asm__("d0"); \
- short _a = (short)(a); \
- long _b = (long) (b); \
- long _c = (long) (c); \
- long _d = (long) (d); \
- long _e = (long) (e); \
- \
- __asm__ volatile \
- ("\
- movl %6,sp@-; \
- movl %5,sp@-; \
- movl %4,sp@-; \
- movl %3,sp@-; \
- movw %2,sp@-; \
- movw %1,sp@-; \
- trap #1; \
- lea sp@(20),sp " \
- : "=r"(retvalue) /* outputs */ \
- : "g"(n), "r"(_a), "r"(_b), "r"(_c), "r"(_d), "r"(_e) \
- : "d0", "d1", "d2", "a0", "a1", "a2" /* clobbered regs */ \
- AND_MEMORY \
- ); \
- retvalue; \
- })
-
- #define Tsetitimer(w,ni,nv,oi,ov) \
- trap_1_wwllll (0x149, (short)w, (long)ni, (long)nv, (long)oi, (long)ov)
- #endif
-
- #define TV2MS(tv, ms) { \
- (ms) = (tv)->tv_sec * 1000L + (tv)->tv_usec / 1000; \
- if (!(ms) && (tv)->tv_usec) \
- (ms) = 1; \
- }
-
- #define MS2TV(ms, tv) { \
- (tv)->tv_sec = (ms) / 1000L; \
- (tv)->tv_usec = ((ms) % 1000L) * 1000L; \
- }
-
- #if 0
- int
- setitimer (which, new, old)
- int which;
- const struct itimerval *new;
- struct itimerval *old;
- {
- unsigned long ni, nv, oi, ov;
- int r;
-
- if (new) {
- TV2MS (&new->it_value, nv);
- TV2MS (&new->it_interval, ni);
- }
- r = Tsetitimer (which, new ? &ni : 0, new ? &nv : 0, &oi, &ov);
- if (r < 0) {
- errno = -r;
- return -1;
- }
- if (old) {
- MS2TV (ov, &old->it_value);
- MS2TV (oi, &old->it_interval);
- }
- return 0;
- }
-
- int
- getitimer (which, old)
- int which;
- struct itimerval *old;
- {
- return setitimer (which, 0, old);
- }
- #endif